#include "param.h"
#include "spline.h"
#include "evaluar.h"

void cbool(bool a)
{
	if (a) 
		{cout << "True";}
	else
		{cout << "False";}
	
	return;
}

/* Variables Globales. */
long int cant_puntos 	= 1000;
bool logs 				= true;
bool mostrar_splines 	= false;
bool mostrar_puntos 	= true;
bool mostrar_evaluacion	= false;
bool mostrar_graficos 	= true;
bool resultados			= true;

/* ./main entrada.in salida.out nombre_fig */
int main(int argc, char** argv)
{	
	string nombre_entrada, nombre_fig;
	
	if (argc == 2)
	{
		string nombre = argv[1];
		nombre_entrada = nombre + ".in";		
		nombre_fig = nombre;
	}	
	else 
	{
		nombre_entrada = "spline.in";			
		nombre_fig = "spline";		
	}
	
	ifstream entrada(nombre_entrada.c_str());
	cout.precision(12);
	
	int n, m;
	/* n: # puntos de control 
	 * m: # puntos de muestreo. */
	
	entrada >> n >> m;
		
	/* Hacer que la cantidad de puntos en los que se va a 
	 * dividir la curva dependa de n. */
	cant_puntos = cant_puntos * n;
	
	/* Coordenadas (x,y) de los puntos de control. */
	vPunto coordenadas;	
	forn(i, n)
	{
		double X, Y;
		entrada >> X >> Y;
		coordenadas.push_back(Punto(X, Y));		
	}
	
	double X, Y;
	entrada >> X >> Y;
	Punto click(X, Y);				
	entrada >> X >> Y;
	Punto nuevo(X, Y);
		
	/* Fin lectura de archivo de entrada. */
	
	vdouble param_1 (n);
	vdouble param_2 (n);
	vdouble param_3 (n);
	double  var = 1.0;
	param_Uniforme(param_1, n, var);
	param_Chord(coordenadas, param_2, n, var);
	param_Centripeta(coordenadas, param_3, n, var);
	enRango(param_1, n);
	enRango(param_2, n);
	enRango(param_3, n);
	
	/* Armar nuevos puntos de la forma (s_i, x(s_i)) y (s_i, y(x_i)). */
	vPunto puntos_x_1 (n);
	vPunto puntos_y_1 (n);
	vPunto puntos_x_2 (n);
	vPunto puntos_y_2 (n);
	vPunto puntos_x_3 (n);
	vPunto puntos_y_3 (n);
	param_puntos(coordenadas, param_1, puntos_x_1, puntos_y_1, n);
	param_puntos(coordenadas, param_2, puntos_x_2, puntos_y_2, n);
	param_puntos(coordenadas, param_3, puntos_x_3, puntos_y_3, n);
	
	/* Armar los splines. */
	vSpline spline_x_1 (n-1);
	vSpline spline_y_1 (n-1);
	vSpline spline_x_2 (n-1);
	vSpline spline_y_2 (n-1);
	vSpline spline_x_3 (n-1);
	vSpline spline_y_3 (n-1);
	
	/* Todos los casos de prueba serán con n > 2. */
	interpolar(puntos_x_1, spline_x_1, n);
	interpolar(puntos_y_1, spline_y_1, n);	
	
	interpolar(puntos_x_2, spline_x_2, n);
	interpolar(puntos_y_2, spline_y_2, n);
	
	interpolar(puntos_x_3, spline_x_3, n);
	interpolar(puntos_y_3, spline_y_3, n);
					
	if (mostrar_graficos)
	{		
		graficar_multi(cant_puntos, nombre_fig + "_parametrizaciones", nombre_fig + " con distintas parametrizaciones.", spline_x_1, spline_y_1, spline_x_2, spline_y_2, spline_x_3, spline_y_3, n);		
	}
	
	return 0;
}
